import { forEachValue } from "../utils";

class Module {
  constructor(modules) {
    // 当前模块
    this._raw = modules;
    // 当前模块的子模块
    this._children = {};
    // 当前模块的状态
    this.state = modules.state;
  }

  get namespaced() {
    // 当访问模块的namespaced 属性时，判断当前模块是否设置了命名空间（namespaced）
    return !!this._raw.namespaced
  }

  // 添加子模块数据
  addChild(key, module) {
    this._children[key] = module;
  }

  // 获取子模块数据
  getChild(key) {
    return this._children[key]
  }

  // 遍历处理mutations
  forEachMutation(cb) {
    if (this._raw.mutations) {
      forEachValue(this._raw.mutations, cb);
    }
  }

  // 遍历处理actions
  forEachAction(cb) {
    if (this._raw.actions) {
      forEachValue(this._raw.actions, cb);
    }
  }

  // 遍历处理getters
  forEachGetter(cb) {
    if (this._raw.getters) {
      forEachValue(this._raw.getters, cb);
    }
  }

  // 遍历处理modules
  forEachModule(cb) {
    // 循环模块，应该循环包装后的模块，这样就可以拿到带有模块方法的Module 对象
    forEachValue(this._children, cb);
  }
}

export default Module
